home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1993 July / InfoMagic USENET CD-ROM July 1993.ISO / sources / misc / volume25 / ted / part05 < prev    next >
Encoding:
Text File  |  1991-11-06  |  54.2 KB  |  1,660 lines

  1. Newsgroups: comp.sources.misc
  2. From: dan%step.uucp@uunet.uu.net (Daniel Weaver)
  3. Subject:  v25i030:  ted - Terminfo/termcap test program, Part05/07
  4. Message-ID: <1991Nov6.043011.6058@sparky.imd.sterling.com>
  5. X-Md4-Signature: 7f8bf736f5cee6df986b721589f2ff2a
  6. Date: Wed, 6 Nov 1991 04:30:11 GMT
  7. Approved: kent@sparky.imd.sterling.com
  8.  
  9. Submitted-by: dan%step.uucp@uunet.uu.net (Daniel Weaver)
  10. Posting-number: Volume 25, Issue 30
  11. Archive-name: ted/part05
  12. Environment: UNIX
  13.  
  14. #! /bin/sh
  15. # This is a shell archive.  Remove anything before this line, then feed it
  16. # into a shell via "sh file" or similar.  To overwrite existing files,
  17. # type "sh file -c".
  18. # The tool that generated this appeared in the comp.sources.unix newsgroup;
  19. # send mail to comp-sources-unix@uunet.uu.net if you want that tool.
  20. # If this archive is complete, you will see the following message at the end:
  21. #        "End of archive 5 (of 7)."
  22. # Contents:  GRIPES charset.c ted.c
  23. # Wrapped by dan@step on Fri Nov  1 11:28:27 1991
  24. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  25. if test -f 'GRIPES' -a "${1}" != "-c" ; then 
  26.   echo shar: Will not clobber existing file \"'GRIPES'\"
  27. else
  28. echo shar: Extracting \"'GRIPES'\" \(1788 characters\)
  29. sed "s/^X//" >'GRIPES' <<'END_OF_FILE'
  30. XNotes accumulated while writting ted.
  31. X
  32. X1) It would be very nice to have a capability to read the character
  33. X   under the cursor.
  34. X
  35. X2) A cap for no scroll should exist.
  36. X
  37. X3) Pads should always be truncated (never rounded).  Every escape
  38. X   sequence has the hidden pad time needed to collect the character
  39. X   following the escape sequence.  If pad times are truncated then
  40. X   a small pad time at 9600 baud will automatically translate to
  41. X   no pad at 300 baud.
  42. X
  43. X4) The padding baud rate is very poorly defined.  Its usage is spotty.
  44. X   tput() ignores the value.  The current baud rate should be provided
  45. X   in the basic support package (rather than full curses).  This
  46. X   would permit tput() to use it.  Note: the $<n/> should always be
  47. X   output.  A numeric cap should be included to divide pads by 2 at a
  48. X   given baud rate. (May not be needed if number 3 is implemented.)
  49. X
  50. X5) It is very difficult, if not impossible, to tell when a terminal
  51. X   is through with its command stream.  Try to time 100 clear screens.
  52. X   The operating system could tell you when the last character was sent
  53. X   but the terminal may still be buffering up data to process.
  54. X   It would be nice to have a capability to enquire about the
  55. X   terminals state (busy/idle).  Many terminals use ENQ for this
  56. X   type of handshake.
  57. X
  58. X6) A cap should be included for changing the baud rate.
  59. X
  60. X7) A numeric cap should be included to say how many colors are in the
  61. X   color palette.  Due to the 16 bit nature of terminfo this value
  62. X   could be the cube root of the number of colors.
  63. X
  64. X8) init_acs() should be moved to the terminfo library so that it may be
  65. X   used without curses.  The hls conversion routines should also be
  66. X   moved from curses to terminfo.
  67. X
  68. X9) The set clock capability (sclk) has no description of its arguments.
  69. END_OF_FILE
  70. if test 1788 -ne `wc -c <'GRIPES'`; then
  71.     echo shar: \"'GRIPES'\" unpacked with wrong size!
  72. fi
  73. # end of 'GRIPES'
  74. fi
  75. if test -f 'charset.c' -a "${1}" != "-c" ; then 
  76.   echo shar: Will not clobber existing file \"'charset.c'\"
  77. else
  78. echo shar: Extracting \"'charset.c'\" \(24367 characters\)
  79. sed "s/^X//" >'charset.c' <<'END_OF_FILE'
  80. X/*
  81. X** This software is Copyright (c) 1991 by Daniel Weaver.
  82. X**
  83. X** Permission is hereby granted to copy, distribute or otherwise
  84. X** use any part of this package as long as you do not try to make
  85. X** money from it or pretend that you wrote it.  This copyright
  86. X** notice must be maintained in any copy made.
  87. X**
  88. X** Use of this software constitutes acceptance for use in an AS IS
  89. X** condition. There are NO warranties with regard to this software.
  90. X** In no event shall the author be liable for any damages whatsoever
  91. X** arising out of or in connection with the use or performance of this
  92. X** software.  Any use of this software is at the user's own risk.
  93. X**
  94. X**  If you make modifications to this software that you feel
  95. X**  increases it usefulness for the rest of the community, please
  96. X**  email the changes, enhancements, bug fixes as well as any and
  97. X**  all ideas to me. This software is going to be maintained and
  98. X**  enhanced as deemed necessary by the community.
  99. X*/
  100. X/* test alternate character sets and graphics modes */
  101. X
  102. X#include "curses.h"
  103. X#include "ted.h"
  104. X
  105. Xstruct mode_list alt_modes[] = {
  106. X   "normal",    "(sgr0)",    "(sgr0)",    1,
  107. X   "standout",    "(smso)",    "(rmso)",    2,
  108. X   "underline",    "(smul)",    "(rmul)",    4,
  109. X   "reverse",    "(rev)",    "(sgr0)",    8,
  110. X   "blink",    "(blink)",    "(sgr0)",    16,
  111. X   "dim",    "(dim)",    "(sgr0)",    32,
  112. X   "bold",    "(bold)",    "(sgr0)",    64,
  113. X   "invis",    "(invis)",    "(sgr0)",    128,
  114. X   "protect",    "(prot)",    "(sgr0)",    256,
  115. X   "altcharset", "(smacs)",    "(rmacs)",    512};
  116. X
  117. X/* On many terminals the underline attribute is the last scan line.
  118. X   This is OK unless the following line is reverse video.
  119. X   Then the underline attribute does not show up.  The following map
  120. X   will reorder the display so that the underline attribute will
  121. X   show up. */
  122. Xint mode_map[10] = {0, 1, 3, 4, 5, 6, 7, 8, 9, 2};
  123. X
  124. Xstruct graphics_pair {
  125. X   char c;
  126. X   char *name;
  127. X};
  128. X
  129. Xstruct graphics_pair glyph[] = {
  130. X    '+', "arrow pointing right",
  131. X    ',', "arrow pointing left",
  132. X    '.', "arrow pointing down",
  133. X    '0', "solid square block",
  134. X    'I', "lantern symbol",
  135. X    '_', "arrow pointing up",
  136. X    '`', "diamond",
  137. X    'a', "checker board (stipple)",
  138. X    'f', "degree symbol",
  139. X    'g', "plus/minus",
  140. X    'h', "board of squares",
  141. X    'j', "lower right corner",
  142. X    'k', "upper right corner",
  143. X    'l', "upper left corner",
  144. X    'm', "lower left corner",
  145. X    'n', "plus",
  146. X    'o', "scan line 1",
  147. X    'p', "scan line 3",
  148. X    'q', "horizontal line",
  149. X    'r', "scan line 7",
  150. X    's', "scan line 9",
  151. X    't', "left tee (|-)",
  152. X    'u', "right tee (-|)",
  153. X    'v', "bottom tee(_|_)",
  154. X    'w', "top tee (T)",
  155. X    'x', "vertical line",
  156. X    'y', "less/equal",
  157. X    'z', "greater/equal",
  158. X    '{', "Pi",
  159. X    '|', "not equal",
  160. X    '}', "UK pound sign",
  161. X    '~', "bullet",
  162. X    '\0', "\0"};
  163. X
  164. X#ifdef TESTCAP
  165. X
  166. Xstatic char tc_buffer[4096];  /* buffer to hold new termcap strings */
  167. Xstatic char *tcb = tc_buffer;  /* pointer into termcap string buffer */
  168. Xextern char tgetflag();
  169. Xextern int tgetnum();
  170. Xextern CHARSTAR tgetstr();
  171. X
  172. X/* In this scheme, characters in the alternate character sets have
  173. X   seperate termcap entries */
  174. Xstruct cap_graphics {
  175. X   char *single_cap;  /* termcap entry name for single lines */
  176. X   char *double_cap;  /* termcap entry name for double lines */
  177. X   char *name;  /* expanded text name */
  178. X};
  179. X
  180. Xstatic char *cap_single[256];
  181. Xstatic char *cap_double[256];
  182. Xstatic char *dual_caps[5][5][5];
  183. Xstatic char cap_cookies[5];
  184. X
  185. Xstruct cap_mode_list {
  186. X   char *name;
  187. X   char *begin_mode, *end_mode;
  188. X   char *cookie_count;
  189. X   int attr;
  190. X};
  191. X
  192. X#ifdef TC
  193. Xstruct cap_graphics tcg[] = {
  194. X   "gv", "GV", "vertical line",
  195. X   "gh", "GH", "horizontal line",
  196. X   "g1", "G1", "top right corner",
  197. X   "g4", "G4", "bottom right corner",
  198. X   "g2", "G2", "top left corner",
  199. X   "g3", "G3", "bottom left corner",
  200. X   "gd", "GD", "down-tick character (T)",
  201. X   "gl", "GL", "left-tick character (-|)",
  202. X   "gr", "GR", "right-tick character (|-)",
  203. X   "gc", "GC", "middle intersection",
  204. X   "gu", "GU", "up-tick character (_|_)",
  205. X   0, 0, 0};
  206. X
  207. Xstruct cap_mode_list cap_alt_modes[] = {
  208. X   "inverse",    "so", "se", "sg", 1,
  209. X   "underline",    "us", "ue", "ug", 2,
  210. X   "blink",    "bo", "be", "bb", 3,
  211. X   "dim",    "it", "ie", "ig", 4,
  212. X   "graphics",    "GS", "GE", "GG", 5,
  213. X   0,        "a3", "A3", 0,    0x24,
  214. X   0,        "a8", "A8", 0,    0x23,
  215. X   0,        "b0", "B0", 0,    0x25,
  216. X   0,        "a7", "A7", 0,    0x41,
  217. X   0,        "a6", "A6", 0,    0x21,
  218. X   0,        "b3", "B3", 0,    0x321,
  219. X   0,        "b4", "B4", 0,    0x51,
  220. X   0,        "b5", "B5", 0,    0x251,
  221. X   0,        "b2", "B2", 0,    0x31,
  222. X   0, 0, 0, 0, 0 };
  223. X
  224. X#else
  225. X#ifdef XENIX
  226. Xstruct cap_graphics tcg[] = {
  227. X   "gv", "GV", "vertical line",
  228. X   "gh", "GH", "horizontal line",
  229. X   "g1", "G1", "top right corner",
  230. X   "g4", "G4", "bottom right corner",
  231. X   "g2", "G2", "top left corner",
  232. X   "g3", "G3", "bottom left corner",
  233. X   "gd", "GD", "down-tick character (T)",
  234. X   "gl", "GL", "left-tick character (-|)",
  235. X   "gr", "GR", "right-tick character (|-)",
  236. X   "gc", "GC", "middle intersection",
  237. X   "gu", "GU", "up-tick character (_|_)",
  238. X#ifdef WHO_KNOWS
  239. X   "f1", "F1", "S/D top right corner",
  240. X   "f4", "F4", "S/D bottom right corner",
  241. X   "f2", "F2", "S/D top left corner",
  242. X   "f3", "F3", "S/D bottom left corner",
  243. X   "fd", "FD", "S/D down-tick character (T)",
  244. X   "fl", "FL", "S/D left-tick character (-|)",
  245. X   "fr", "FR", "S/D right-tick character (|-)",
  246. X   "fc", "FC", "S/D middle intersection",
  247. X   "fu", "FU", "S/D up-tick character (_|_)",
  248. X#endif
  249. X   0, 0, 0};
  250. X
  251. Xstruct cap_mode_list cap_alt_modes[] = {
  252. X   "inverse",    "so", "se", "sg", 1,
  253. X   "underline",    "us", "ue", "ug", 2,
  254. X   "blink",    "bo", "be", "bb", 3,
  255. X   "dim",    "it", "ie", "ig", 4,
  256. X   "graphics",    "GS", "GE", "GG", 5,
  257. X   0,        "a3", "A3", 0,    0x24,
  258. X   0,        "a8", "A8", 0,    0x23,
  259. X   0,        "b0", "B0", 0,    0x25,
  260. X   0,        "a7", "A7", 0,    0x41,
  261. X   0,        "a6", "A6", 0,    0x21,
  262. X   0,        "b3", "B3", 0,    0x321,
  263. X   0,        "b4", "B4", 0,    0x51,
  264. X   0,        "b5", "B5", 0,    0x251,
  265. X   0,        "b2", "B2", 0,    0x31,
  266. X   0, 0, 0, 0, 0 };
  267. X
  268. X#else
  269. X#ifdef MV
  270. Xstruct cap_graphics tcg[] = {
  271. X   "GV", "GGV", "vertical line",
  272. X   "GH", "GGH", "horizontal line",
  273. X   "G1", "GG1", "top right corner",
  274. X   "G4", "GG4", "bottom right corner",
  275. X   "G2", "GG2", "top left corner",
  276. X   "G3", "GG3", "bottom left corner",
  277. X   "GD", "GGD", "Down-tick character (T)",
  278. X   "GL", "GGL", "Left-tick character (-|)",
  279. X   "GR", "GGR", "Right-tick character (|-)",
  280. X   "GC", "GGC", "middle intersection",
  281. X   "GU", "GGU", "Up-tick character (_|_)",
  282. X   0, 0, 0};
  283. X
  284. Xstruct cap_mode_list cap_alt_modes[] = {
  285. X   "standout",    "so", "se", "sg", 1,
  286. X   "underline",    "us", "ue", "ug", 2,
  287. X   "graphics",    "GS", "GE", "GG", 3,
  288. X   "blink",    "mb", "me",    0, 4,
  289. X   "dim",    "mh", "me",    0, 5,
  290. X   "bold",    "md", "me",    0, 6,
  291. X   "overstrike","mo", "me",    0, 7,
  292. X   0, 0, 0, 0, 0 };
  293. X#endif
  294. X#endif
  295. X#endif
  296. X#endif
  297. X
  298. Xtest_status()
  299. X   {
  300. X      int i, max;
  301. X      char *s;
  302. X      static char m[] = "*** status line *** 123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.";
  303. X
  304. X      can_test("(hs)(wsl)(tsl)(fsl)(dsl)");
  305. X      if (stop_testing) return;
  306. X
  307. X      if (has_status_line != 1)
  308. X         {
  309. X            ptextln("Terminal has no status line (hs)");
  310. X            return;
  311. X         }
  312. X
  313. X      max = width_status_line == -1 ? columns : width_status_line;
  314. X      sprintf(temp, "Terminal has status line of %d characters", max);
  315. X      ptextln(temp);
  316. X      put_str("This line s");
  317. X      s = tparm(to_status_line, 0);
  318. X      putp(s);
  319. X         for (i = 0; i < max; i++) putchp(m[i]);
  320. X      putp(from_status_line);
  321. X      putln("hould not be broken");
  322. X      (void) wait_here();
  323. X      if (dis_status_line)
  324. X         {
  325. X            ptextln("Disable status line (dsl)");
  326. X            putp(dis_status_line);
  327. X         }
  328. X      else ptextln("Terminal can not disable status line (dsl)");
  329. X   }
  330. X
  331. X
  332. Xeat_cookie()
  333. X   {  /* put a blank if this is not a magic cookie terminal */
  334. X      if (magic_cookie_glitch < 1) putchp(' ');
  335. X   }
  336. X
  337. X
  338. Xput_mode(s)
  339. Xchar *s;
  340. X   {  /* send the attribute string (with or without % execution) */
  341. X#ifdef SVR3_2
  342. X      putp(tparm(s)); /* allow % execution */
  343. X#else
  344. X      putp(s);    /* ignore % */
  345. X#endif
  346. X   }
  347. X
  348. X
  349. Xvoid
  350. Xset_attr(a)
  351. Xint a;
  352. X   {  /* set the attribute from the bits in a */
  353. X      int i, b[32];
  354. X
  355. X      if (magic_cookie_glitch > 0) char_count += magic_cookie_glitch;
  356. X      if (a == 0 && exit_attribute_mode)
  357. X         {
  358. X            put_mode(exit_attribute_mode);
  359. X            return;
  360. X         }
  361. X         for (i = 0; i < 31; i++) b[i] = (a >> i) & 1;
  362. X      putp(tparm(set_attributes, b[1], b[2], b[3], b[4], b[5],
  363. X         b[6], b[7], b[8], b[9]));
  364. X   }
  365. X
  366. X
  367. Xstatic void
  368. Xtest_sgr()
  369. X   {
  370. X      int i, j;
  371. X
  372. X      maybe_wait(12);
  373. X      if (!exit_attribute_mode)
  374. X         ptextln("Terminal has no (sgr0) entry");
  375. X      ptext("Test video attributes (sgr)");
  376. X
  377. X         for (i = 0; i < (sizeof(alt_modes) / sizeof(struct mode_list));
  378. X            i++) {
  379. X            put_crlf();
  380. X            sprintf(temp, "%d %-20s", i, alt_modes[i].name);
  381. X            put_str(temp);
  382. X            set_attr(alt_modes[i].number);
  383. X            sprintf(temp, "%s", alt_modes[i].name);
  384. X            put_str(temp);
  385. X            set_attr(0);
  386. X         }
  387. X      maybe_wait(14);
  388. X      putln("Double mode test");
  389. X         for (i = 0; i <= 9; i++) {
  390. X            sprintf(temp, " %2d ", mode_map[i]);
  391. X            put_str(temp);
  392. X         }
  393. X         for (i = 0; i <= 9; i++) {
  394. X            put_crlf();
  395. X            sprintf(temp, "%d", mode_map[i]);  put_str(temp);
  396. X               for (j = 0; j <= 9;  j++) {
  397. X                  eat_cookie();
  398. X                  set_attr((1 << mode_map[i]) | (1 << mode_map[j]));
  399. X                  put_str("Aa");
  400. X                  set_attr(0);
  401. X                  if (j < 9) eat_cookie();
  402. X               }
  403. X         }
  404. X      put_crlf();
  405. X#ifdef SVR3_2
  406. X      if (max_attributes >= 0)
  407. X         {
  408. X            sprintf(temp, "(ma) Maximum attributes %d", max_attributes);
  409. X            put_crlf();
  410. X            ptextln(temp);
  411. X         }
  412. X#endif
  413. X   }
  414. X
  415. X
  416. X#if defined(TC) || defined(XENIX) || defined(MV)
  417. Xstatic void
  418. Xtest_attr_mode()
  419. X   {  /* test TC sytle attributes */
  420. X      int i, j, v, cookies;
  421. X      char *cap_start, *cap_end;
  422. X      char *test_string =    "123ABCXYZabcxyz";
  423. X      char *missing_string =    "*** missing ***";
  424. X
  425. X      if (stop_testing)
  426. X         {
  427. X               for (i = 0; cap_alt_modes[i].begin_mode; i++) {
  428. X                  cap_test(cap_alt_modes[i].begin_mode);
  429. X                  cap_test(cap_alt_modes[i].end_mode);
  430. X                  cap_test(cap_alt_modes[i].cookie_count);
  431. X               }
  432. X            return;
  433. X         }
  434. X      maybe_wait(18);
  435. X         for (i = j = 0; cap_alt_modes[i].begin_mode; i++) {
  436. X            if (cap_start = tgetstr(cap_alt_modes[i].begin_mode, &tcb))
  437. X               if (!cap_start[0]) cap_start = NULL;
  438. X            if (cap_end = tgetstr(cap_alt_modes[i].end_mode, &tcb))
  439. X               if (!cap_end[0]) cap_end = NULL;
  440. X            cookies = tgetnum(cap_alt_modes[i].cookie_count, &tcb);
  441. X            if (cap_start || cap_alt_modes[i].name)
  442. X               {
  443. X                  if (cookies < 0) cookies = 0;
  444. X                  if (cap_alt_modes[i].name)
  445. X                     {
  446. X                        if (j < cookies) j = cookies;
  447. X                     }
  448. X                  else cookies = j;
  449. X                  putchp(LEFT_BRACE);
  450. X                  put_str(cap_alt_modes[i].begin_mode);
  451. X                  putchp(RIGHT_BRACE);  putchp(' ');
  452. X                  if (cookies < 1) putchp(' ');
  453. X                  if (cap_start)
  454. X                     {
  455. X                        putp(cap_start);
  456. X                        put_str(test_string);
  457. X                        putp(cap_end);
  458. X                     }
  459. X                  else put_str(missing_string);
  460. X                  if (cookies < 1) putchp(' ');
  461. X                  putchp(' ');  putchp(LEFT_BRACE);
  462. X                  put_str(cap_alt_modes[i].end_mode);
  463. X                  putchp(RIGHT_BRACE);
  464. X                  if (cap_alt_modes[i].cookie_count)
  465. X                     {
  466. X                        putchp(' ');  putchp(LEFT_BRACE);
  467. X                        put_str(cap_alt_modes[i].cookie_count);
  468. X                        putchp(RIGHT_BRACE);
  469. X                        sprintf(temp, " %d", cookies);
  470. X                        put_str(temp);
  471. X                     }
  472. X                     for (v = cap_alt_modes[i].attr; v; v >>= 4) {
  473. X                        putchp(' ');
  474. X                        put_str(cap_alt_modes[(v & 15) - 1].name);
  475. X                     }
  476. X                  put_crlf();
  477. X               }
  478. X         }
  479. X   }
  480. X#else
  481. X
  482. X
  483. Xstatic void
  484. Xtest_one_attr(n, begin_mode, end_mode)
  485. Xint n;
  486. Xchar *begin_mode, *end_mode;
  487. X   {   /* test attributes without (sgr) */
  488. X      int i;
  489. X
  490. X      sprintf(temp, "%-10s %s ", alt_modes[n].name,
  491. X         alt_modes[n].begin_mode);
  492. X      ptext(temp);
  493. X         for ( ; char_count < 19; ) putchp(' ');
  494. X      if (begin_mode)
  495. X         {
  496. X            putchp('.');
  497. X            put_mode(begin_mode);
  498. X            put_str(alt_modes[n].name);
  499. X               for (i = strlen(alt_modes[n].name); i < 13; i++)
  500. X                  putchp(' ');
  501. X            if (end_mode)
  502. X               {
  503. X                  put_mode(end_mode);
  504. X                  sprintf(temp, ". %s", alt_modes[n].end_mode);
  505. X               }
  506. X            else
  507. X               {
  508. X                  set_attr(0);
  509. X                  strcpy(temp, ". (sgr)");
  510. X               }
  511. X            ptextln(temp);
  512. X         }
  513. X      else
  514. X         {
  515. X               for (i = 0; i < magic_cookie_glitch; i++)
  516. X                  putchp('*');
  517. X            put_str("*** missing ***");
  518. X               for (i = 0; i < magic_cookie_glitch; i++)
  519. X                  putchp('*');
  520. X            put_crlf();
  521. X         }
  522. X   }
  523. X
  524. X
  525. Xstatic void
  526. Xtest_attr_mode()
  527. X   {
  528. X      if (stop_testing)
  529. X         {
  530. X            int i;
  531. X
  532. X               for (i = 0; i < 9; i++) {
  533. X                  can_test(alt_modes[i].begin_mode);
  534. X                  can_test(alt_modes[i].end_mode);
  535. X               }
  536. X            can_test("sgr");
  537. X            return;
  538. X         }
  539. X      maybe_wait(11);
  540. X      putln("Test video attributes");
  541. X      test_one_attr(1, enter_standout_mode, exit_standout_mode);
  542. X      test_one_attr(2, enter_underline_mode, exit_underline_mode);
  543. X      test_one_attr(9, enter_alt_charset_mode, exit_alt_charset_mode);
  544. X      if (!exit_attribute_mode && !set_attributes)
  545. X         {
  546. X            ptextln("(sgr0) exit attribute mode is not defined.");
  547. X            return;
  548. X         }
  549. X      test_one_attr(3, enter_reverse_mode, exit_attribute_mode);
  550. X      test_one_attr(4, enter_blink_mode, exit_attribute_mode);
  551. X      test_one_attr(5, enter_dim_mode, exit_attribute_mode);
  552. X      test_one_attr(6, enter_bold_mode, exit_attribute_mode);
  553. X      test_one_attr(7, enter_secure_mode, exit_attribute_mode);
  554. X      test_one_attr(8, enter_protected_mode, exit_attribute_mode);
  555. X   }
  556. X#endif
  557. X
  558. X#if defined(SVR3) || defined(TC) || defined(XENIX) || defined(MV)
  559. X#define GLYPHS 256
  560. X#undef acs_map
  561. X
  562. Xstatic void
  563. Xdump_acs()
  564. X   {  /* display all posible acs characters */
  565. X      int i, c;
  566. X
  567. X      put_clear();
  568. X      ptextln("The following characters are available. (smacs) (rmacs)");
  569. X         for (i = ' '; i <= '`'; i += 32) {
  570. X            put_crlf();
  571. X            put_mode(exit_alt_charset_mode);
  572. X               for (c = 0; c < 32; c++) {
  573. X                  putchp(c + i);
  574. X               }
  575. X            put_crlf();
  576. X            put_mode(enter_alt_charset_mode);
  577. X               for (c = 0; c < 32; c++) {
  578. X                  putchp(c + i);
  579. X               }
  580. X            put_mode(exit_alt_charset_mode);
  581. X            put_crlf();
  582. X         }
  583. X      put_mode(exit_alt_charset_mode);
  584. X      (void) wait_here();
  585. X   }
  586. X
  587. X
  588. Xstatic int
  589. Xtest_acs()
  590. X   {  /* alternate character set */
  591. X      int i, j;
  592. X      char valid_glyph[GLYPHS];
  593. X      char acs_map[GLYPHS];
  594. X      static char vt100[] = "`afgjklmnopqrstuvwxyz{|}~";
  595. X
  596. X#ifdef SVR3
  597. X      if (stop_testing)
  598. X         {
  599. X            can_test("(acsc)(enacs)(smacs)(rmacs)");
  600. X            return 0;
  601. X         }
  602. X      line_count = 0;
  603. X         for (i = 0; i < GLYPHS; i++) {
  604. X            valid_glyph[i] = FALSE;
  605. X            acs_map[i] = i;
  606. X         }
  607. X      if (acs_chars)
  608. X         {
  609. X            sprintf(temp, "Alternate character set map: %s",
  610. X               expand(acs_chars));
  611. X            putln(temp);
  612. X               for (i = 0; acs_chars[i]; i += 2) {
  613. X                  if (acs_chars[i + 1] == 0) break;
  614. X                     for (j = 0; ; j++) {
  615. X                        if (glyph[j].c == acs_chars[i])
  616. X                           {
  617. X                              acs_map[glyph[j].c] = acs_chars[i + 1];
  618. X                              valid_glyph[glyph[j].c] = TRUE;
  619. X                              break;
  620. X                           }
  621. X                        if (glyph[j].name[0] == '\0')
  622. X                           {
  623. X                              sprintf(temp, " %c %s", acs_chars[i],
  624. X                              "*** has no mapping ***");
  625. X                              putln(temp);
  626. X                              break;
  627. X                           }
  628. X                     }
  629. X               }
  630. X         }
  631. X      else
  632. X         {
  633. X            ptextln("acs_chars not defined (acsc)");
  634. X            /* enable the VT-100 graphics characters (default) */
  635. X               for (i = 0; vt100[i]; i++) {
  636. X                     valid_glyph[vt100[i]] = TRUE;
  637. X               }
  638. X         }
  639. X      if (ena_acs) putp(ena_acs);
  640. X         for (i = 0; glyph[i].name[0]; i++) {
  641. X            if (valid_glyph[glyph[i].c])
  642. X               {
  643. X                  put_mode(enter_alt_charset_mode);
  644. X                  put_this(acs_map[glyph[i].c]);  char_count++;
  645. X                  put_mode(exit_alt_charset_mode);
  646. X                  sprintf(temp, " %-30.30s", glyph[i].name);
  647. X                  put_str(temp);
  648. X                  if (char_count + 33 >= columns) put_crlf();
  649. X                  if (line_count >= lines)
  650. X                     {
  651. X                        (void) wait_here();
  652. X                        put_clear();
  653. X                     }
  654. X               }
  655. X         }
  656. X      if (char_count > 1) put_crlf();
  657. X#ifdef ACS_ULCORNER
  658. X      maybe_wait(5);
  659. X      putln("Here are 2 boxes");
  660. X      put_mode(enter_alt_charset_mode);
  661. X      put_this(ACS_ULCORNER);  put_this(ACS_TTEE);
  662. X      put_this(ACS_URCORNER);  put_this(ACS_ULCORNER);
  663. X      put_this(ACS_HLINE); put_this(ACS_URCORNER);
  664. X      char_count += 6;
  665. X      if (move_standout_mode) put_crlf();
  666. X      else
  667. X         {
  668. X            put_mode(exit_alt_charset_mode);
  669. X            put_crlf();
  670. X            put_mode(enter_alt_charset_mode);
  671. X         }
  672. X      put_this(ACS_LTEE);  put_this(ACS_PLUS);  put_this(ACS_RTEE);
  673. X      put_this(ACS_VLINE);
  674. X      if (magic_cookie_glitch >= 1) put_this(' ');
  675. X      else
  676. X         {
  677. X            put_mode(exit_alt_charset_mode);
  678. X            put_this(' ');
  679. X            put_mode(enter_alt_charset_mode);
  680. X         }
  681. X      put_this(ACS_VLINE);
  682. X      char_count += 6;
  683. X      if (move_standout_mode) put_crlf();
  684. X      else
  685. X         {
  686. X            put_mode(exit_alt_charset_mode);
  687. X            put_crlf();
  688. X            put_mode(enter_alt_charset_mode);
  689. X         }
  690. X      put_this(ACS_LLCORNER);  put_this(ACS_BTEE);
  691. X      put_this(ACS_LRCORNER);  put_this(ACS_LLCORNER);
  692. X      put_this(ACS_HLINE); put_this(ACS_LRCORNER);
  693. X      char_count += 6;
  694. X      put_mode(exit_alt_charset_mode);
  695. X      put_crlf();
  696. X#endif
  697. X#else /* TESTCAP */
  698. X      if (stop_testing)
  699. X         {
  700. X               for (i = 0; tcg[i].single_cap; i++) {
  701. X                  cap_test(tcg[i].single_cap);
  702. X                  cap_test(tcg[i].double_cap);
  703. X               }
  704. X            can_test("(smacs)(rmacs)");
  705. X            return 0;
  706. X         }
  707. X      /* display graphics characters for termcap style graphics */
  708. X      putln("single   double");
  709. X         for (i = 0; tcg[i].single_cap; i++) {
  710. X            cap_single[i] = tgetstr(tcg[i].single_cap, &tcb);
  711. X            cap_double[i] = tgetstr(tcg[i].double_cap, &tcb);
  712. X            putchp(LEFT_BRACE);
  713. X            put_str(tcg[i].single_cap);
  714. X            putchp(RIGHT_BRACE);  putchp(' ');
  715. X            if (cap_single[i] && cap_single[i][0])
  716. X               {
  717. X                  putchp(' ');
  718. X                  put_mode(enter_alt_charset_mode);
  719. X                  put_str(cap_single[i]);
  720. X                  put_mode(exit_alt_charset_mode);
  721. X                  putchp(' ');
  722. X               }
  723. X            else put_str("***");
  724. X            putchp(' ');  putchp(LEFT_BRACE);
  725. X            put_str(tcg[i].double_cap);
  726. X            putchp(RIGHT_BRACE);  putchp(' ');
  727. X            if (cap_double[i] && cap_double[i][0])
  728. X               {
  729. X                  putchp(' ');
  730. X                  put_mode(enter_alt_charset_mode);
  731. X                  put_str(cap_double[i]);
  732. X                  put_mode(exit_alt_charset_mode);
  733. X                  putchp(' ');
  734. X               }
  735. X            else put_str("***");
  736. X            putchp(' ');
  737. X            putln(tcg[i].name);
  738. X         }
  739. X#endif
  740. X      return wait_here();
  741. X   }
  742. X#endif
  743. X
  744. X
  745. Xvoid
  746. Xtest_charset()
  747. X   {  /* test begins here */
  748. X      int ch;
  749. X
  750. X      if (run_test(bell, "Terminal has no bell (bel)", FALSE))
  751. X         do {
  752. X            new_test(2);
  753. X            sprintf(temp, "Testing bell (bel), %s", expand(bell));
  754. X            ptextln(temp);
  755. X            putp(bell);
  756. X         } while (repeat_test(FALSE));
  757. X
  758. X      if (run_test(flash_screen,
  759. X         "Terminal has no flash screen (flash)", FALSE))
  760. X         do {
  761. X            new_test(2);
  762. X            ptextln("Testing visual bell (flash)");
  763. X            putp(flash_screen);
  764. X         } while (repeat_test(FALSE));
  765. X
  766. X#ifdef TC
  767. X      new_test(6);
  768. X      if (run_test(cursor_invisible,
  769. X         "Terminal has no cursor off (civis)", FALSE))
  770. X         do {
  771. X            ptext("(civis) Turn off the cursor.");
  772. X            putp(cursor_invisible);
  773. X         } while (repeat_test(FALSE));
  774. X
  775. X      can_test(":CO");
  776. X      sprintf(temp, "Terminal has no cursor on %cCO%c",
  777. X         LEFT_BRACE, RIGHT_BRACE);
  778. X      if (run_test(cursor_on, temp, FALSE))
  779. X         do {
  780. X            putchp(LEFT_BRACE);
  781. X            put_str("CO");
  782. X            putchp(RIGHT_BRACE);
  783. X            put_str(" Turn on the cursor.");
  784. X            putp(cursor_on);
  785. X         } while (repeat_test(FALSE));
  786. X
  787. X      if (run_test(cursor_visible,
  788. X         "Terminal has no cursor_visible (cvvis)", FALSE))
  789. X         do {
  790. X            ptext("(cvvis) Make cursor very visible.");
  791. X            putp(cursor_visible);
  792. X         } while (repeat_test(FALSE));
  793. X#else
  794. X      new_test(6);
  795. X      can_test("(civis)(cvvis)");
  796. X
  797. X      if (cursor_normal && run_test(cursor_invisible,
  798. X         "Terminal has no cursor off (civis)", FALSE))
  799. X         do {
  800. X            ptext("(civis) Turn off the cursor.");
  801. X            putp(cursor_invisible);
  802. X         } while (repeat_test(FALSE));
  803. X
  804. X      if (cursor_normal && run_test(cursor_visible,
  805. X         "Terminal has no cursor_visible (cvvis)", FALSE))
  806. X         do {
  807. X            ptext("(cvvis) Make cursor very visible.");
  808. X            putp(cursor_visible);
  809. X         } while (repeat_test(FALSE));
  810. X#endif
  811. X      if (run_test(cursor_normal,
  812. X         "Terminal has no cursor_normal (cnorm)", FALSE))
  813. X         do {
  814. X            ptext("(cnorm) Normal cursor.");
  815. X            putp(cursor_normal);
  816. X         } while (repeat_test(FALSE));
  817. X
  818. X         do {
  819. X            test_status();
  820. X         } while (repeat_test(FALSE));
  821. X
  822. X#if defined(SVR3) || defined(TC) || defined(XENIX) || defined(MV)
  823. X      if (stop_testing) (void) test_acs();
  824. X      else
  825. X#endif
  826. X#if defined(SVR3)
  827. X      if (enter_alt_charset_mode || acs_chars)
  828. X#endif
  829. X#if defined(SVR3) || defined(TC) || defined(XENIX) || defined(MV)
  830. X         {
  831. X            putln("Display graphics symbols");
  832. X            (void) wait_here();
  833. X            put_clear();
  834. X            ch = 0;
  835. X               do {
  836. X                  /* for terminals that use seperate fonts for
  837. X                     attributes (such as X windows) the line drawing
  838. X                     characters must be checked for each font.  */
  839. X                  if (ch >= '0' & ch <= '8')
  840. X                     {
  841. X                        set_attr(alt_modes[ch - '0'].number);
  842. X                        ch = test_acs();
  843. X                        set_attr(0);
  844. X                     }
  845. X                  else ch = test_acs();
  846. X               } while (ch == 'r' || ch == 'R' || (ch >= '0' && ch <= '9'));
  847. X            if (enter_alt_charset_mode) dump_acs();
  848. X            put_clear();
  849. X         }
  850. X#if defined(SVR3)
  851. X      else ptextln("Terminal has no alternate character set (smacs)");
  852. X#endif
  853. X#endif
  854. X
  855. X         do {
  856. X            test_attr_mode();
  857. X         } while (repeat_test(FALSE));
  858. X
  859. X#ifndef TESTCAP
  860. X      if (run_test(set_attributes,
  861. X         "Terminal has no set attribute command (sgr)", TRUE))
  862. X         do {
  863. X            test_sgr();
  864. X         } while (repeat_test(FALSE));
  865. X#endif
  866. X   }
  867. END_OF_FILE
  868. if test 24367 -ne `wc -c <'charset.c'`; then
  869.     echo shar: \"'charset.c'\" unpacked with wrong size!
  870. fi
  871. # end of 'charset.c'
  872. fi
  873. if test -f 'ted.c' -a "${1}" != "-c" ; then 
  874.   echo shar: Will not clobber existing file \"'ted.c'\"
  875. else
  876. echo shar: Extracting \"'ted.c'\" \(25007 characters\)
  877. sed "s/^X//" >'ted.c' <<'END_OF_FILE'
  878. X/*
  879. X** This software is Copyright (c) 1991 by Daniel Weaver.
  880. X**
  881. X** Permission is hereby granted to copy, distribute or otherwise
  882. X** use any part of this package as long as you do not try to make
  883. X** money from it or pretend that you wrote it.  This copyright
  884. X** notice must be maintained in any copy made.
  885. X**
  886. X** Use of this software constitutes acceptance for use in an AS IS
  887. X** condition. There are NO warranties with regard to this software.
  888. X** In no event shall the author be liable for any damages whatsoever
  889. X** arising out of or in connection with the use or performance of this
  890. X** software.  Any use of this software is at the user's own risk.
  891. X**
  892. X**  If you make modifications to this software that you feel
  893. X**  increases it usefulness for the rest of the community, please
  894. X**  email the changes, enhancements, bug fixes as well as any and
  895. X**  all ideas to me. This software is going to be maintained and
  896. X**  enhanced as deemed necessary by the community.
  897. X*/
  898. X/* test terminal capabilities */
  899. X
  900. X#define MAIN
  901. X
  902. X#include "curses.h"
  903. X#include "ted.h"
  904. X
  905. X/*
  906. X   This program is designed to test terminfo, not curses.  Therefore
  907. X   I have used as little of curses as possible.
  908. X
  909. X   Pads associated with the following capabilities are used to set
  910. X   delay times in the handler:  (cr), (ind), (cub1), (ff), (tab).
  911. X
  912. X   I use the (nxon) capability to set the tty handler with/without
  913. X   xon/xoff.  If (smxon)/(rmxon) is defined I will change the terminal
  914. X   too.
  915. X
  916. X   (xon) inhibits the sending of delay characters in putp().
  917. X   If the terminal is defined with no padding then the (xon) boolian
  918. X   is a don't care.  In this case I recommend that it be reset.
  919. X */
  920. X
  921. Xchar *op_list[] = {
  922. X   " -a   test alternate character set",
  923. X   " -A   test ANSI status reports",
  924. X   " -c   test color",
  925. X   " -C   test cursor",
  926. X   "+-d   set/reset tty handler delays (default: off)",
  927. X   " -D <num> debug level",
  928. X   " -e   echo test",
  929. X   "+-E   terminal uses eight bit data",
  930. X   " -f   test function keys",
  931. X   " -g   ANSI graphics mode display",
  932. X   " -G   ANSI character sets",
  933. X   "+-H   output the echo test in hex (default: off)",
  934. X   " -i   do not send init strings",
  935. X   " -j <num> junk characters before ACK (default: 0)",
  936. X   " -k   compare with known caps",
  937. X   " -K   list known capabilities",
  938. X   " -l   lengthen pad tests to 20 sec. (default: 5 sec.)",
  939. X   " -m   test modes",
  940. X   "+-n   force (nxon) set/reset xon/xoff in tty handler (default: off)",
  941. X   " -p   test pad",
  942. X   " -P   test printer",
  943. X   "+-q   terminal does not use ENQ/ACK",
  944. X   " -Q <num> ... Enquire sequence (in decimal) (default: 5)",
  945. X   " -r   resume pad testing at [cap]",
  946. X   " -s   shorten pad tests to 2 sec. (default: 5 sec.)",
  947. X   " -S   status report test",
  948. X   "+-t   translate \\b\\f\\n\\r\\t to/from default (default: off)",
  949. X   " -T <num> terminating character (in decimal) (default: 6)",
  950. X   " -u   use Down/Up kbd scan mode",
  951. X   " -v   verify baud rate",
  952. X   "+-x   force (xon) set/reset (toggles pads) (default: off)",
  953. X   " -X   run pad tests with XON/XOFF and ENQ/ACK",
  954. X   (char *) 0};
  955. X
  956. Xextern char ttytype[];
  957. X
  958. XFILE *debug_fp;
  959. Xint debug_char_count, debug_level;
  960. Xchar temp[512];
  961. Xchar tty_basename[64];
  962. Xchar tty_shortname[64];
  963. X/* control.c */
  964. Xint test_count;        /* counts how many times end_test() was called */
  965. Xint tty_can_sync;    /* TRUE if tty_sync_error() returned FALSE */
  966. Xint ACK_char;        /* -T terminating ACK character */
  967. Xint junk_chars;        /* -j number of junk characters */
  968. Xchar tty_ENQ[32];    /* -Q enquire string */
  969. Xchar tty_ACK[TTY_ACK_SIZE];  /* ACK string, set by tty_sync_error() */
  970. Xchar *current_test;    /* text name of current test */
  971. Xchar done_test[128];    /* holds the Done message */
  972. Xlong start_time;    /* start of test (in seconds) */
  973. Xlong end_time;        /* end of test (in seconds) */
  974. Xint capper;        /* points into cap_list[] for time tests */
  975. Xstruct cap_tab cap_list[CAP_MAX];  /* holds time test results */
  976. Xchar *ced_name[EDIT_MAX];    /* cap name used for pad edit */
  977. Xchar **ced_value[EDIT_MAX];    /* cap value used for pad edit */
  978. Xint milli_pad;        /* accumulated pad in 10 microsecond units */
  979. Xint milli_reps;        /* multiplicative pad in 10 microsecond units */
  980. Xint pad_sent;        /* number of characters for pad */
  981. Xint rerun;        /* used with -X option to rerun a test */
  982. Xint skip_next;        /* skip the remaining tests for this cap */
  983. X/* pad.c */
  984. Xint cap_tested;        /* set by test_pad() if a cap was tested */
  985. Xint stop_testing;    /* force all testing to stop (used by Quit) */
  986. Xint resume_testing;    /* set by -r option to resume pad tests */
  987. Xchar letter;        /* current character being displayed */
  988. Xint letter_number;    /* points into letters[] */
  989. Xint rated_lines;    /* baud rate sensitive number of lines */
  990. Xint augment, reps;    /* number of characters (or lines) effected */
  991. Xint ops;        /* number of operations done */
  992. Xlong full_test;        /* test_length seconds worth of characters */
  993. Xlong char_max;        /* max characters for this test */
  994. Xlong char_sent;        /* number of characters sent (including pads) */
  995. Xint clear_select;    /* points into clr_test_value[] */
  996. Xint clr_test_value[CLEAR_TEST_MAX];
  997. Xint clr_test_reps[CLEAR_TEST_MAX];
  998. Xchar *cap_select;    /* points to cap to test */
  999. X/* output.c */
  1000. Xint char_count;        /* counts characters */
  1001. Xint line_count;        /* counts line feeds */
  1002. Xint expand_chars;    /* length of expand() string */
  1003. Xint replace_mode;    /* used to output replace mode padding */
  1004. Xint can_go_home;    /* TRUE if we can fashion a home command */
  1005. Xint can_clear_screen;    /* TRUE if we can somehow clear the screen */
  1006. X/* ted.c - options and modes */
  1007. Xint translate_mode;    /* -t option - translate tab, bs, cr, lf, ff */
  1008. Xint scan_mode;        /* -u option - use scan codes */
  1009. Xint building_cap_list;    /* -k option - report known caps */
  1010. Xint write_ted_file;    /* -X option - write ted.$TERM file */
  1011. Xint time_pad;        /* -X option - run the time tests */
  1012. Xint test_length;    /* -s -l options - test length in seconds */
  1013. Xint char_mask;        /* +E -> 0xFF else 0x7F, eight bit data mask */
  1014. Xint select_delay_type;    /* +-d option - set handler delays */
  1015. Xint select_pads;    /* +-x option - 0->no pads, 1->pad, 2->no change */
  1016. Xint select_xon_xoff;    /* +-n option - new value of (xon) */
  1017. Xint xon_xoff_state;    /* original value of (xon) */
  1018. X/* sysdep.c */
  1019. Xint tty_frame_size;    /* asynch frame size times 2 */
  1020. Xunsigned long tty_baud_rate;  /* baud rate - bits per second */
  1021. Xint tty_abort;        /* stty abort character */
  1022. Xint not_a_tty;        /* TRUE if output is not a tty (i.e. pipe) */
  1023. Xint nodelay_read;    /* TRUE if NDELAY is set */
  1024. X
  1025. X/* translate mode default strings */
  1026. Xchar *TM_carriage_return = "\r";
  1027. Xchar *TM_cursor_down = "\n";
  1028. Xchar *TM_scroll_forward = "\n";
  1029. Xchar *TM_newline = "\r\n";
  1030. Xchar *TM_cursor_left = "\b";
  1031. Xchar *TM_bell = "\007";
  1032. Xchar *TM_form_feed = "\f";
  1033. Xchar *TM_tab = "\t";
  1034. X
  1035. Xop_scan(c)
  1036. Xint c;
  1037. X   {  /* scan the op_list[] for c, return c if found, else 0 */
  1038. X      int i, j;
  1039. X      char *s;
  1040. X
  1041. X         for (i = 0; op_list[i]; i++) {
  1042. X            if (op_list[i][2] == c) return c;
  1043. X         }
  1044. X      /* option not found */
  1045. X      put_str("usage:  ted [-");
  1046. X         for (i = 0; op_list[i]; i++) putchp(op_list[i][2]);
  1047. X      putln("] [baud] [cap ...]");
  1048. X      /* print the long ones */
  1049. X         for (i = 0; op_list[i]; i++) {
  1050. X            j = strlen(op_list[i]) + 3;
  1051. X            if (j + j >= columns)
  1052. X               {
  1053. X                  put_str("   ");  putln(op_list[i]);
  1054. X               }
  1055. X         }
  1056. X      /* print the short ones */  s = NULL;
  1057. X         for (i = 0; op_list[i]; i++) {
  1058. X            j = strlen(op_list[i]) + 3;
  1059. X            if (j + j < columns)
  1060. X               if (s)
  1061. X                  {
  1062. X                     sprintf(temp, "   %-*s   %s",
  1063. X                        (columns / 2) - 4, s, op_list[i]);
  1064. X                     putln(temp);
  1065. X                     s = NULL;
  1066. X                  }
  1067. X               else s = op_list[i];
  1068. X         }
  1069. X      if (s)
  1070. X         {
  1071. X            put_str("   ");  putln(s);
  1072. X         }
  1073. X      bye_kids(1);
  1074. X      return 0;
  1075. X   }
  1076. X
  1077. X
  1078. Xstatic
  1079. Xput_name(cap, name)
  1080. Xchar *cap, *name;
  1081. X   {  /* send the cap name followed by the cap */
  1082. X      if (cap)
  1083. X         {
  1084. X            ptext(name);
  1085. X            putp(cap);
  1086. X         }
  1087. X   }
  1088. X
  1089. X
  1090. Xreport_cap(tag, s)
  1091. Xchar *tag, *s;
  1092. X   {  /* expand the cap or print *** missing *** */
  1093. X      int i;
  1094. X
  1095. X      ptext(tag);
  1096. X         for (i = char_count; i < 13; i++) putchp(' ');
  1097. X      put_str(" = ");
  1098. X      if (s) putln(expand(s));
  1099. X      else putln("*** missing ***");
  1100. X   }
  1101. X
  1102. X
  1103. Xdisplay_basic()
  1104. X   {  /* display the basic terminal definitions */
  1105. X#ifdef TESTCAP
  1106. X      putln("\nTermcap test program");
  1107. X#else
  1108. X      putln("\nTerminfo test program");
  1109. X#endif
  1110. X      put_str("\nName: ");
  1111. X      putln(ttytype);
  1112. X
  1113. X      maybe_wait(14);
  1114. X      report_cap("\\r ^M (cr)", carriage_return);
  1115. X      report_cap("\\n ^J (ind)", scroll_forward);
  1116. X      report_cap("\\b ^H (cub1)", cursor_left);
  1117. X      report_cap("\\t ^I (ht)", tab);
  1118. X      report_cap("\\f ^L (ff)", form_feed);
  1119. X      report_cap("      (clear)", clear_screen);
  1120. X      report_cap("      (home)", cursor_home);
  1121. X      report_cap("      (nel)", newline);
  1122. X      report_cap("      ENQ", tty_ENQ);
  1123. X
  1124. X      sprintf(temp, "\nTerminal size: %d x %d", columns, lines);
  1125. X      putln(temp);
  1126. X      sprintf(temp, "\nBaud rate: %d, Frame size: %d.%d",
  1127. X         tty_baud_rate, tty_frame_size >> 1, (tty_frame_size & 1) * 5);
  1128. X      ptextln(temp);
  1129. X      (void) wait_here();
  1130. X   }
  1131. X
  1132. X
  1133. Xstatic void
  1134. Xread_opts(argc, argv)
  1135. Xint *argc;
  1136. Xchar **argv[];
  1137. X   {
  1138. X      /* The .termdefs file contains options that are to be used
  1139. X         every time a particular terminal is tested.
  1140. X         File format:
  1141. X            terminal-name options ...
  1142. X         Options for variations should be placed first in the file.
  1143. X         e.g. use vt100-w before vt100, if vt100-w has specific options.
  1144. X         If an exact match is not found, then the base terminal name
  1145. X         will be used. */
  1146. X      char *opts_filename = ".termdefs";
  1147. X      int i, j, l, s, state, narg, ch;
  1148. X      FILE *fp;
  1149. X      char *str;
  1150. X      char *new_args[256];
  1151. X      extern char *getenv();
  1152. X
  1153. X      str = getenv("TERM");
  1154. X      if (strlen(ttytype)) str = ttytype;
  1155. X         for (s = 0; tty_shortname[s] = tty_basename[s] = str[s]; ++s)
  1156. X            if (str[s] == '|') break;
  1157. X            else
  1158. X            if (str[s] == '-') tty_basename[s] = '\0';
  1159. X      tty_basename[s] = tty_shortname[s] = '\0';
  1160. X      l = strlen(tty_basename);
  1161. X
  1162. X      if (str = getenv("HOME"))
  1163. X         sprintf(temp, "%s/%s", str, opts_filename);
  1164. X      else strcpy(temp, opts_filename);
  1165. X      if (!(fp = fopen(temp, "r")))
  1166. X         {
  1167. X            return;
  1168. X         }
  1169. X      ptext("Searching for ");  ptextln(tty_shortname);
  1170. X      state = 0;
  1171. X      narg = 1;
  1172. X         for ( ;; ) {
  1173. X            /* scan past white space */
  1174. X               for ( ;; ) {
  1175. X                  ch = getc(fp);
  1176. X                  if (ch == EOF || (ch != ' ' && ch != '\t')) break;
  1177. X               }
  1178. X            if (ch == EOF) break;
  1179. X               for (i = 0; i < sizeof(temp) - 1; i++) {
  1180. X                  temp[i] = ch;
  1181. X                  if (ch == '\0' || ch == '\n' || ch == '\r' ||
  1182. X                     ch == EOF || ch == ' ' || ch == '\t')
  1183. X                        break;
  1184. X                  ch = getc(fp);
  1185. X               }
  1186. X            temp[i] = '\0';
  1187. X            if (state == 0 && i > 0)
  1188. X               {
  1189. X                  if (i == l && !strncmp(temp, tty_shortname, l))
  1190. X                     state = 1;
  1191. X                  else
  1192. X                  if (i == s && !strncmp(temp, tty_shortname, s))
  1193. X                     state = 1;
  1194. X                  else state = 2;
  1195. X               }
  1196. X            else
  1197. X            if (state == 1 && narg < 256 && i > 0)
  1198. X               {
  1199. X                  str = (char *) malloc(i + 1);
  1200. X                  strcpy(str, temp);
  1201. X                  new_args[narg++] = str;
  1202. X               }
  1203. X            if (ch == EOF) break;
  1204. X            else
  1205. X            if (ch == '\r' || ch == '\n')
  1206. X               if (state == 1) break;
  1207. X               else state = 0;
  1208. X         }
  1209. X      fclose(fp);
  1210. X      if (narg == 1) return;
  1211. X      new_args[0] = **argv;
  1212. X         for (j = 1; narg < 256 && j < *argc; ) {
  1213. X               new_args[narg++] = (*argv)[j++];
  1214. X            }
  1215. X      *argv = (char **) malloc(narg * sizeof(char *));
  1216. X      *argc = narg;
  1217. X         for (j = 0; j < narg; j++) {
  1218. X            (*argv)[j] = new_args[j];
  1219. X         }
  1220. X   }
  1221. X
  1222. X
  1223. Xdisplay_sgr(puc)
  1224. Xchar puc;
  1225. X   {  /* print the sgr display for ANSI terminals */
  1226. X      int k;
  1227. X
  1228. X      temp[0] = puc;
  1229. X      temp[1] = '\0';
  1230. X         for (k = 0; k < 80; k++) {
  1231. X            if (char_count + 8 > 80) put_crlf();
  1232. X            else
  1233. X            if (char_count + 8 > columns) put_crlf();
  1234. X            else
  1235. X            if (k > 0) printf(" ");
  1236. X            printf("\033[%s%dmMode %2d\033[0m", temp, k, k);
  1237. X            char_count += 8;
  1238. X            if (puc == '\0')
  1239. X               {
  1240. X                  if (k == 19) printf("\033[10m");
  1241. X                  if (k == 39) printf("\033[37m");
  1242. X                  if (k == 49) printf("\033[40m");
  1243. X               }
  1244. X         }
  1245. X      put_crlf();
  1246. X      if (puc == '<') printf("\033[<1m");
  1247. X      else
  1248. X      if (puc) printf("\033[%s0m", temp);
  1249. X      set_attr(0);
  1250. X   }
  1251. X
  1252. X
  1253. Xprint_sgr20(on, off)
  1254. Xint on, off;
  1255. X   {  /* print the sgr line for sgr20() */
  1256. X      if (char_count > columns - 13)
  1257. X     put_crlf();
  1258. X      else
  1259. X      if (char_count) put_str("  ");
  1260. X      char_count += 11;
  1261. X      printf("%d/%d \033[%dmon\033[%dm off\033[0m",
  1262. X    on, off, on, off);
  1263. X   }
  1264. X
  1265. X
  1266. Xsgr20()
  1267. X   {  /* display the enter/exit attributes 1-9 and 20-29 */
  1268. X      int k;
  1269. X
  1270. X      ptextln("Test enter/exit attributes 1-9 and 21-29.");
  1271. X         for (k = 1; k < 10; k++) {
  1272. X        print_sgr20(k, k + 20);
  1273. X         }
  1274. X      print_sgr20(1, 22);  /* bold */
  1275. X      print_sgr20(2, 22);  /* dim */
  1276. X      print_sgr20(8, 22);  /* blank */
  1277. X      printf("\033[0m");
  1278. X      set_attr(0);
  1279. X   }
  1280. X
  1281. X
  1282. Xreset_init(sending)
  1283. Xint sending;
  1284. X   {  /* send the reset and init strings */
  1285. X      int i;
  1286. X
  1287. X      can_test("(lines)(cols)(xon)(nxon)");
  1288. X#ifdef TESTCAP
  1289. X      can_test("(is2)(rs2)(if)");
  1290. X      cap_test("pt");
  1291. X      cap_test("rs");
  1292. X      if (physical_tabs)
  1293. X         {
  1294. X            if (tab == NULL) tab = "\t";
  1295. X            if (init_tabs <= 0) init_tabs = 8;
  1296. X         }
  1297. X      /* for some odd reason ATT thinks (rs2) should map to r2
  1298. X         but the BSD world uses rs. */
  1299. X      if (reset_2string == NULL)
  1300. X         {
  1301. X            reset_2string = reset_string;
  1302. X            captrans[cap_index("rs2", 3)] = "rs2:rs";
  1303. X         }
  1304. X#else
  1305. X      can_test("(is1)(is2)(is3)(rs1)(rs2)(rs3)(iprog)(hts)(tbc)(it)(if)");
  1306. X#endif
  1307. X      if (!sending) return;
  1308. X
  1309. X      if (init_prog)
  1310. X         (void) system(init_prog);
  1311. X
  1312. X      ptext("Terminal reset");
  1313. X      i = char_count;
  1314. X      put_name(reset_1string, " (rs1)");
  1315. X      put_name(reset_2string, " (rs2)");
  1316. X      put_name(reset_3string, " (rs3)");
  1317. X      if (i != char_count) put_crlf();
  1318. X
  1319. X      ptext(" init");
  1320. X      put_name(init_1string, " (is1)");
  1321. X      put_name(init_2string, " (is2)");
  1322. X      if (set_tab && clear_all_tabs && init_tabs != 8)
  1323. X         {
  1324. X            put_crlf();
  1325. X            putp(clear_all_tabs);
  1326. X               for (char_count = 0; char_count < columns; char_count++) {
  1327. X                  put_this(' ');
  1328. X                  if ((char_count & 7) == 7) putp(set_tab);
  1329. X               }
  1330. X            put_cr();
  1331. X         }
  1332. X      /* run the initialization file */
  1333. X      if (init_file && init_file[0])
  1334. X         {
  1335. X            FILE *fp;
  1336. X            int ch;
  1337. X
  1338. X            if (fp = fopen(init_file, "r"))
  1339. X               {  /* send the init file */
  1340. X                  sprintf(temp, " (if) %s", init_file);
  1341. X                  ptextln(temp);
  1342. X                     while (1) {
  1343. X                        ch = getc(fp);
  1344. X                        if (ch == EOF) break;
  1345. X                        put_this(ch);
  1346. X                     }
  1347. X                  fclose(fp);
  1348. X               }
  1349. X            else
  1350. X               {
  1351. X                  sprintf(temp, "\nCannot open init file (if) %s", init_file);
  1352. X                  ptextln(temp);
  1353. X               }
  1354. X         }
  1355. X      put_name(init_3string, " (is3)");
  1356. X
  1357. X      fflush(stdout);
  1358. X      sleep(1);
  1359. X   }
  1360. X
  1361. X
  1362. Xmain(argc, argv)
  1363. Xint argc;
  1364. Xchar *argv[];
  1365. X   {
  1366. X      int test_all, cap_x, send_reset_init, list_tested;
  1367. X      int i, j, k, v, hex_out, num_type;
  1368. X
  1369. X      tty_init();
  1370. X      char_count = 0;
  1371. X      SETUP;
  1372. X      read_opts(&argc, &argv);
  1373. X
  1374. X      /* set up the defaults */
  1375. X      send_reset_init = test_all = translate_mode = replace_mode = 1;
  1376. X      list_tested = 0;
  1377. X      junk_chars = num_type = hex_out = scan_mode = 0;
  1378. X      time_pad = write_ted_file = cap_x = building_cap_list = 0;
  1379. X      stop_testing = select_delay_type = debug_level = 0;
  1380. X      char_mask = STRIP_PARITY;
  1381. X      select_pads = 2;
  1382. X      tty_can_sync = TRUE;
  1383. X      test_length = 5;  /* seconds */
  1384. X      select_xon_xoff = needs_xon_xoff ? 1 : 0;
  1385. X      ACK_char = 6;
  1386. X      tty_ENQ[0] = '\005';  tty_ENQ[1] = '\0';
  1387. X
  1388. X      /* scan the option flags */
  1389. X         for (i = 1; i < argc; i++) {
  1390. X            k = argv[i][0] == '+';
  1391. X            if (argv[i][0] == '-' | argv[i][0] == '+')
  1392. X               for (j = 1; argv[i][j]; j++)
  1393. X               switch (op_scan(argv[i][j])) {
  1394. X                  case 'd':  select_delay_type = k; break;
  1395. X                  case 'D':
  1396. X                     debug_level = 0;
  1397. X                     num_type = 'D';
  1398. X                     break;
  1399. X                  case 'i':  send_reset_init = FALSE; break;
  1400. X                  case 'j':  num_type = 'j'; break;
  1401. X                  case 'n':  select_xon_xoff = k; break;
  1402. X                  case 'q':  tty_can_sync = k; break;
  1403. X                  case 'Q':
  1404. X                     tty_ENQ[0] = '\0';
  1405. X                     num_type = 'Q';
  1406. X                     break;
  1407. X                  case 'T':  num_type = 'T'; break;
  1408. X                  case 'u':  scan_mode = TRUE;
  1409. X                     char_mask = ALLOW_PARITY;
  1410. X                     break;
  1411. X                  case 'x':  select_pads = k; break;
  1412. X                  case 'X':  cap_x = TRUE; break;
  1413. X                  default:
  1414. X                     break;
  1415. X               }
  1416. X            else
  1417. X            if (argv[i][0] >= '0' && argv[i][0] <= '9')
  1418. X               {
  1419. X                     for (j = v = 0; k = argv[i][j]; j++) {
  1420. X                        if (k >= '0' & k <= '9')
  1421. X                           v = v * 10 + (k - '0');
  1422. X                        else break;
  1423. X                     }
  1424. X                  switch (num_type) {
  1425. X                     case 'D': /* internal debug level */
  1426. X                        debug_level = v;
  1427. X                        num_type = 0;
  1428. X                        break;
  1429. X                     case 'j': /* number of junk characters */
  1430. X                        junk_chars = v;
  1431. X                        num_type = 0;
  1432. X                        break;
  1433. X                     case 'T': /* ENQ terminator (instead of ACK) */
  1434. X                        ACK_char = v;
  1435. X                        num_type = 0;
  1436. X                        break;
  1437. X                     case 'Q': /* ENQ string */
  1438. X                        j = strlen(tty_ENQ);
  1439. X                        if (j < sizeof(tty_ENQ) - 1)
  1440. X                           {
  1441. X                              tty_ENQ[j] = v;
  1442. X                              tty_ENQ[j + 1] = '\0';
  1443. X                           }
  1444. X                        if (v == 0) num_type = 0;
  1445. X                        break;
  1446. X                     default:
  1447. X                        /* assume its the baud rate */
  1448. X                        tty_frame_size = 20;
  1449. X                        tty_baud_rate = v;
  1450. X                        num_type = 0;
  1451. X                     }
  1452. X               }
  1453. X         }
  1454. X      if (scan_mode) scan_init(tty_basename);
  1455. X
  1456. X      if (!tty_ENQ[0]) tty_can_sync = 0;
  1457. X      if (cap_x && tty_can_sync)
  1458. X         {
  1459. X            select_xon_xoff = select_pads = TRUE;
  1460. X         }
  1461. X      fflush(stdout);  /* flush any output */
  1462. X      tty_set();
  1463. X
  1464. X      go_home();  /* set can_go_home */
  1465. X      put_clear();  /* set can_clear_screen */
  1466. X
  1467. X      reset_init(send_reset_init);
  1468. X
  1469. X      xon_xoff_state = xon_xoff;
  1470. X      if (xon_xoff = select_xon_xoff)
  1471. X         {  /* turn on xon/xoff */
  1472. X            if (enter_xon_mode) put_name(enter_xon_mode, " (smxon)");
  1473. X            else
  1474. X               {
  1475. X                  ptext("\nPlease set the terminal for XON/XOFF handshaking.");
  1476. X                  (void) wait_here();
  1477. X               }
  1478. X         }
  1479. X      else
  1480. X      if (exit_xon_mode) put_name(exit_xon_mode, " (rmxon)");
  1481. X
  1482. X      /*
  1483. X       * I assume that the reset and init strings may not have
  1484. X       * the correct pads.  (Because that part of the test comes
  1485. X       * much later.)  Because of this, I allow the terminal some
  1486. X       * time to catch up.
  1487. X       */
  1488. X      fflush(stdout);  /* waste some time */
  1489. X      sleep(1);  /* waste more time */
  1490. X
  1491. X      if (enter_ca_mode)
  1492. X         {
  1493. X            putp(enter_ca_mode);
  1494. X            put_clear();  /* just incase we switched pages */
  1495. X         }
  1496. X
  1497. X      /* turn on/off pads */
  1498. X      if (select_pads != 2) xon_xoff = select_pads;
  1499. X
  1500. X      put_crlf();
  1501. X         for (i = 1; i < argc; i++) {
  1502. X            k = argv[i][0] == '+';
  1503. X            if (argv[i][0] == '-' | argv[i][0] == '+') {
  1504. X               for (j = 1; argv[i][j]; j++)
  1505. X               switch (op_scan(argv[i][j])) {
  1506. X                  case 'a':  test_all = 0;
  1507. X            test_charset();  break;
  1508. X                  case 'A':  test_all = 0;
  1509. X            test_ansi_reports();  break;
  1510. X                  case 'c':  test_all = 0;
  1511. X            test_color(); break;
  1512. X                  case 'C':  test_all = 0;
  1513. X            test_move();  break;
  1514. X                  case 'e':  test_all = 0;
  1515. X            test_report(0, hex_out);  break;
  1516. X                  case 'E':
  1517. X                        char_mask = k ? ALLOW_PARITY : STRIP_PARITY;
  1518. X                        break;
  1519. X                  case 'f':  test_all = 0;
  1520. X            test_funky(hex_out);  break;
  1521. X                  case 'g':
  1522. X                        put_clear();
  1523. X                           for (k = 0; ; ) {
  1524. X                              display_sgr(k);
  1525. X                              k = wait_here();
  1526. X                              if (k == 'r' || k == 'R') k = 0;
  1527. X                              else
  1528. X                              if (k < '<' | k > '?') break;
  1529. X                           }
  1530. X            sgr20();
  1531. X                        test_all = 0;
  1532. X                        (void) wait_here();
  1533. X            break;
  1534. X                  case 'G':  test_all = 0;
  1535. X            ansi_graphics();  break;
  1536. X                  case 'H':  hex_out = k;  break;
  1537. X                  case 'k':  list_tested = 1;
  1538. X                  case 'K':  building_cap_list = stop_testing = TRUE;
  1539. X                        break;
  1540. X                  case 'l':  test_length = 20; break;
  1541. X                  case 'm':  test_all = 0;
  1542. X            test_mode();  break;
  1543. X                  case 'p':  test_all = 0;
  1544. X            test_pad((char *) 0);
  1545. X            break;
  1546. X                  case 'P':  test_all = 0;
  1547. X            test_printer();  break;
  1548. X                  case 'r':  resume_testing = TRUE; break;
  1549. X                  case 's':  test_length = 2; break;
  1550. X                  case 'S':  test_all = 0;
  1551. X            test_report(1, hex_out);  break;
  1552. X                  case 't':  translate_mode = k; break;
  1553. X                  case 'v':  test_all = 0;
  1554. X                        tty_baud_rate = 0;
  1555. X                        verify_time();
  1556. X            break;
  1557. X                  case 'X':
  1558. X                        test_all = 0;
  1559. X                        if (!tty_can_sync) break;
  1560. X                        write_ted_file = time_pad = TRUE;
  1561. X                        if (test_length < 10) test_length = 10;
  1562. X            test_pad((char *) 0);
  1563. X                        break;
  1564. X                  default:
  1565. X                     break;
  1566. X               }
  1567. X            }
  1568. X            else
  1569. X            if (argv[i][0] && (argv[i][0] < '0' | argv[i][0] > '9'))
  1570. X               {
  1571. X#ifdef TESTCAP
  1572. X                  extern char *cap_to_info();
  1573. X                  char *info_name;
  1574. X
  1575. X                  info_name = cap_to_info(argv[i]);
  1576. X                  if (info_name) test_pad(info_name);
  1577. X                  else test_pad(argv[i]);
  1578. X#else
  1579. X                  test_pad(argv[i]);
  1580. X#endif
  1581. X                  if (!cap_tested)
  1582. X                     {
  1583. X                        sprintf(temp,
  1584. X                        "Terminal capability (%s) not tested", argv[i]);
  1585. X                        ptextln(temp);
  1586. X                     }
  1587. X                  test_all = resume_testing = 0;
  1588. X               }
  1589. X         }
  1590. X
  1591. X      /* Tests may clear screen at the start of the test without waiting
  1592. X         for user input.  Tests must wait for the user at the end of
  1593. X         the test group. */
  1594. X      if (test_all)
  1595. X         {
  1596. X            if (building_cap_list) test_printer();
  1597. X            else display_basic();
  1598. X            test_mode();
  1599. X            test_charset();
  1600. X            test_color();
  1601. X            test_move();
  1602. X            test_funky(hex_out);
  1603. X            test_pad((char *) 0);
  1604. X         }
  1605. X
  1606. X      if (building_cap_list) print_reported(list_tested);
  1607. X      if (write_ted_file) (void) print_cap_list();
  1608. X      put_str("\nTerminal test complete\n");
  1609. X      bye_kids(0);
  1610. X      return (0);
  1611. X   }
  1612. X
  1613. X
  1614. Xbye_kids(n)
  1615. Xint n;
  1616. X{   /* reset the tty and exit */
  1617. X      ignoresig();
  1618. X      if (exit_ca_mode) putp(exit_ca_mode);
  1619. X      if (xon_xoff_state && enter_xon_mode) putp(enter_xon_mode);
  1620. X      else
  1621. X      if (!xon_xoff_state && exit_xon_mode) putp(exit_xon_mode);
  1622. X      if (debug_fp) fclose(debug_fp);
  1623. X      tty_reset();
  1624. X      fclose(stdin);
  1625. X      fclose(stdout);
  1626. X      fclose(stderr);
  1627. X      if (not_a_tty) sleep(1);
  1628. X      exit(n);
  1629. X}
  1630. END_OF_FILE
  1631. if test 25007 -ne `wc -c <'ted.c'`; then
  1632.     echo shar: \"'ted.c'\" unpacked with wrong size!
  1633. fi
  1634. # end of 'ted.c'
  1635. fi
  1636. echo shar: End of archive 5 \(of 7\).
  1637. cp /dev/null ark5isdone
  1638. MISSING=""
  1639. for I in 1 2 3 4 5 6 7 ; do
  1640.     if test ! -f ark${I}isdone ; then
  1641.     MISSING="${MISSING} ${I}"
  1642.     fi
  1643. done
  1644. if test "${MISSING}" = "" ; then
  1645.     echo You have unpacked all 7 archives.
  1646.     rm -f ark[1-9]isdone
  1647. else
  1648.     echo You still need to unpack the following archives:
  1649.     echo "        " ${MISSING}
  1650. fi
  1651. ##  End of shell archive.
  1652. exit 0
  1653.  
  1654. exit 0 # Just in case...
  1655. -- 
  1656. Kent Landfield                   INTERNET: kent@sparky.IMD.Sterling.COM
  1657. Sterling Software, IMD           UUCP:     uunet!sparky!kent
  1658. Phone:    (402) 291-8300         FAX:      (402) 291-4362
  1659. Please send comp.sources.misc-related mail to kent@uunet.uu.net.
  1660.